package com.lcx.movie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lcx.movie.entity.Comment;
import com.lcx.movie.mapper.CommentMapper;
import com.lcx.movie.mapper.UserMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lcx.movie.mapper.MovieMapper;
import com.lcx.movie.entity.Movie;
import com.lcx.movie.service.MovieService;

import java.util.List;

/**
 * 电影服务实现类，用于处理与电影相关的业务逻辑。
 * 继承自 MyBatis-Plus 的 ServiceImpl，提供对 Movie 实体的基本 CRUD 操作。
 *
 * @version 1.0
 * @author lcx
 * @date 2025/2/9 11:25
 */
@Service
public class MovieServiceImpl extends ServiceImpl<MovieMapper, Movie> implements MovieService{
    @Autowired
    private CommentMapper commentMapper; // 评论数据访问对象
    @Autowired
    private MovieMapper movieMapper;
    @Autowired
    private UserMapper userMapper; // 用户数据访问对象

    /**
     * 根据电影 ID 获取电影详情，包括关联的评论和评论的用户信息。
     *
     * @param movieId 电影 ID
     * @return 包含评论和用户信息的电影对象
     */
    @Override
    public Movie MovieById(Integer movieId) {
        // 根据电影 ID 查询电影基本信息
        Movie movie = getBaseMapper().selectById(movieId);

        // 查询该电影的所有评论
        List<Comment> commentList = commentMapper.findCommentsByMovieId(movieId);

        // 如果存在评论，则为每个评论补充评论用户的详细信息
        if (commentList != null) {
            for (Comment comment : commentList) {
                // 根据评论中的用户 ID 查询用户信息，并设置到评论对象中
                comment.setCommentUser(userMapper.findUserById(comment.getUserId()));
            }
            // 将评论列表设置到电影对象中
            movie.setCommentList(commentList);
        }

        return movie;
    }

    /**
     * 根据电影数量查询电影
     * @param searchMovie 查询信息
     * @return 电影集合
     */
    @Override
    public List<Movie> sortMovieByCount(String searchMovie) {
        return movieMapper.sortMovieByCount(searchMovie);
    }

    /**
     * 根据电影日期查询电影
     * @param searchMovie 查询信息
     * @return 电影集合
     */
    @Override
    public List<Movie> sortMovieByDate(String searchMovie) {
        return movieMapper.sortMovieByDate(searchMovie);
    }

    /**
     * 根据评分查询电影
     * @param searchMovie 查询信息
     * @return 电影集合
     */
    @Override
    public List<Movie> sortMovieByScore(String searchMovie) {
        return movieMapper.sortMovieByScore(searchMovie);
    }
    /**
     * 分页条件查询电影列表
     * @param movieCnName 电影名称
     * @return 电影集合
     */
    public List<Movie> selectPageByMovieCnName(String movieCnName,Integer cinemaId){
        return movieMapper.selectPageByMovieCnName(movieCnName,cinemaId);
    }
    /**
     * 根据电影id删除电影
     * @param movieId 电影id
     * @return 受影响的行数
     */
    public int deleteMovieByMovieId(int movieId){
        return movieMapper.deleteMovieByMovieId(movieId);
    }
    /**
     * 查询所有电影
     * @return 电影集合
     */
    public List<Movie> selectMovies(){
        return movieMapper.selectMovies();
    }
    /**
     * 新增电影
     * @param movie 电影实体
     * @return 收影响的行数
     */
    public int insertMovie(Movie movie){
        return movieMapper.insertMovie(movie);
    }
    /**
     * 根据电影id查出电影对象
     * @param movieId 电影id
     * @return 电影对象
     */
    @Override
    public List<Movie> selectMovieByMovieId(Integer movieId) {
        return movieMapper.selectMovieByMovieId(movieId);
    }
    /**
     * 修改电影信息
     * @param movie 电影对象
     * @return 受影响的行数
     */
    public int updateMovie(Movie movie){
        return movieMapper.updateMovie(movie);
    }

    /**
     * 单独修改电影的海报
     * @param movie 电影实体
     * @return 受影响的行数
     */
    @Override
    public int updateMovieImg(Movie movie){
        return movieMapper.updateMovieImg(movie);
    }
    /**
     * 修改电影评分:根据用户评分以及评分人数进行计算
     * @return 受影响的行数
     */
    @Override
    public int updateMovieScore(){
        return  movieMapper.updateMovieScore();
    }

    /**
     * 根据类型，地区，年份 分类查询电影
     * @param movieType 电影类型
     * @param movieCountry 电影地区
     * @param movieReleaseDate 年份
     * @return 电影集合
     */
    @Override
    public List<Movie> getMoviesByType(String movieType,String movieCountry,String movieReleaseDate){
        return movieMapper.getMoviesByType(movieType,movieCountry,movieReleaseDate);
    }
    /**
     * 根据电影时间状态判断是：正在热映，即将上映和经典影片
     * @param status 状态
     * @return 电影集合
     */
    @Override
    public List<Movie> getMoviesByStatus(String status){
        return movieMapper.getMoviesByStatus(status);
    }

    /**
     * top榜单 根据电影评分来排序
     * @return 电影集合
     */
    @Override
    public List<Movie> getMovieScore(){
        return movieMapper.getMovieScore();
    }

    /**
     * 分页模糊查询平台电影管理
     * @param movieCnName 电影名
     * @return 电影集合
     */
    @Override
    public List<Movie> selectMoviePage(@Param("movieCnName")String movieCnName,@Param("movieState") Integer movieState) {
        return movieMapper.selectMoviePage(movieCnName,movieState);
    }
    /**
     * 根据电影id修改电影状态
     * @param movieId 电影id
     * @return 受影响的行数
     */
    @Override
    public int updateMovieState(@Param("movieId") Integer movieId){
        return movieMapper.updateMovieState(movieId);
    }

}
